Minimizing Coins
題目
有 種幣值,最少可以用幾個硬幣湊出 元 ?
輸入
第一行有兩個整數 和 ,分別代表幣值的數量以及目標要湊出多少錢。
第二行有 個相異正整數 ,代表每種幣值。
- ()
- ()
- ()
輸出
最少需要多少個硬幣才能湊出 元 ?
若沒有辦法湊出 元,輸出
範例測資
Input:
3 11
1 5 7
Output:
3
共 個硬幣湊出 元
想法
舉個例子,假設有其中一種幣值為 ,且要湊出 元,那麼我們可以得知湊出 元的方法是湊出 元所需要的硬幣數量再加一(加上剛剛的 元),或是原本有更好的方案可以湊出 元就保留原本的方案。
狀態定義
設 的狀態為湊出 元所需要的最少硬幣數量
狀態轉移
枚舉每一種幣值,若能夠湊出 元,那麼可以推得轉移式為 ,因為我們可以多花一個幣值為 的硬幣讓金額從 變成
Note 1: 注意 是否小於
Note 2: 初始狀態為 ,因為湊出總合為 需要 個硬幣
範例程式碼
C++ 範例
#include<bits/stdc++.h>
#define int long long
#define IO ios_base::sync_with_stdio(0), cin.tie(0)
using namespace std;
signed main() {
IO;
int n, x;
cin >> n >> x;
int c[n];
for(int i = 0; i < n; i++) {
cin >> c[i];
}
int dp[x + 1];
for(int i = 1; i <= x; i++) {
dp[i] = -1;
}
dp[0] = 0;
for(int i = 1; i <= x; i++) {
for(int j = 0; j < n; j++) {
if(i - c[j] >= 0) {
if(dp[i - c[j]] != -1) {
if(dp[i] == -1) {
dp[i] = dp[i - c[j]] + 1;
}
else {
dp[i] = min(dp[i], dp[i - c[j]] + 1);
}
}
}
}
}
cout << dp[x];
}